package com.minio.learning;

import com.minio.learning.config.MinioConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Scanner;

/**
 * MinIO 学习项目主程序
 * 
 * 这个类提供一个交互式菜单，让你可以：
 * 1. 查看配置信息
 * 2. 运行基础示例
 * 3. 运行进阶示例
 * 4. 查看帮助文档
 */
public class MainApp {
    
    private static final Logger logger = LoggerFactory.getLogger(MainApp.class);
    
    public static void main(String[] args) {
        printWelcome();
        
        // 显示配置信息
        MinioConfig.printConfig();
        
        // 交互式菜单
        showMenu();
    }
    
    /**
     * 打印欢迎信息
     */
    private static void printWelcome() {
        System.out.println();
        System.out.println("╔═══════════════════════════════════════════════════╗");
        System.out.println("║                                                   ║");
        System.out.println("║          欢迎使用 MinIO 学习项目！                ║");
        System.out.println("║                                                   ║");
        System.out.println("║     MinIO 是一个高性能的对象存储服务              ║");
        System.out.println("║     完全兼容 Amazon S3 API                        ║");
        System.out.println("║                                                   ║");
        System.out.println("╚═══════════════════════════════════════════════════╝");
        System.out.println();
    }
    
    /**
     * 显示交互式菜单
     */
    private static void showMenu() {
        Scanner scanner = new Scanner(System.in);
        
        while (true) {
            System.out.println("\n========== 主菜单 ==========");
            System.out.println("1. 运行基础示例（适合初学者）");
            System.out.println("2. 运行进阶示例（学习高级功能）");
            System.out.println("3. 查看 MinIO 核心概念");
            System.out.println("4. 查看常见使用场景");
            System.out.println("5. 查看配置信息");
            System.out.println("0. 退出");
            System.out.println("===========================");
            System.out.print("\n请选择（输入数字）：");
            
            String choice = scanner.nextLine().trim();
            
            switch (choice) {
                case "1":
                    runBasicExample();
                    break;
                case "2":
                    runAdvancedExample();
                    break;
                case "3":
                    showCoreConcepts();
                    break;
                case "4":
                    showUseCases();
                    break;
                case "5":
                    MinioConfig.printConfig();
                    break;
                case "0":
                    System.out.println("\n👋 感谢使用，再见！");
                    return;
                default:
                    System.out.println("\n❌ 无效的选择，请重试");
            }
        }
    }
    
    /**
     * 运行基础示例
     */
    private static void runBasicExample() {
        System.out.println("\n正在运行基础示例...\n");
        try {
            com.minio.learning.example.BasicExample.main(new String[]{});
        } catch (Exception e) {
            logger.error("运行基础示例时出错", e);
        }
    }
    
    /**
     * 运行进阶示例
     */
    private static void runAdvancedExample() {
        System.out.println("\n正在运行进阶示例...\n");
        try {
            com.minio.learning.example.AdvancedExample.main(new String[]{});
        } catch (Exception e) {
            logger.error("运行进阶示例时出错", e);
        }
    }
    
    /**
     * 显示核心概念
     */
    private static void showCoreConcepts() {
        System.out.println("\n========== MinIO 核心概念 ==========\n");
        
        System.out.println("📦 【桶 Bucket】");
        System.out.println("   - 类似于文件系统中的\"顶级目录\"");
        System.out.println("   - 用于组织和管理对象");
        System.out.println("   - 桶名称必须全局唯一");
        System.out.println("   - 只能包含小写字母、数字、连字符\n");
        
        System.out.println("📄 【对象 Object】");
        System.out.println("   - 实际存储的文件数据");
        System.out.println("   - 每个对象包含：数据 + 元数据");
        System.out.println("   - 通过对象名（key）唯一标识");
        System.out.println("   - 对象名可以包含斜杠模拟文件夹\n");
        
        System.out.println("🔑 【对象名 Object Key】");
        System.out.println("   - 对象的唯一标识符");
        System.out.println("   - 可以包含路径，如 'images/2024/photo.jpg'");
        System.out.println("   - 支持 UTF-8 字符");
        System.out.println("   - 最大长度 1024 字节\n");
        
        System.out.println("🔗 【预签名 URL】");
        System.out.println("   - 临时访问链接");
        System.out.println("   - 可设置过期时间");
        System.out.println("   - 无需认证即可访问");
        System.out.println("   - 适合文件分享\n");
        
        System.out.println("📊 【元数据 Metadata】");
        System.out.println("   - 描述对象的信息");
        System.out.println("   - 包括：大小、类型、上传时间等");
        System.out.println("   - 可以自定义元数据");
        System.out.println("   - 不影响对象内容\n");
        
        System.out.println("=====================================");
    }
    
    /**
     * 显示常见使用场景
     */
    private static void showUseCases() {
        System.out.println("\n========== 常见使用场景 ==========\n");
        
        System.out.println("🖼️  【场景 1：图片/视频存储】");
        System.out.println("   - 网站用户上传的头像、照片");
        System.out.println("   - 视频平台的视频文件");
        System.out.println("   - 电商平台的商品图片");
        System.out.println("   示例：avatars/user123/avatar.jpg\n");
        
        System.out.println("💾 【场景 2：备份存储】");
        System.out.println("   - 数据库备份文件");
        System.out.println("   - 日志文件归档");
        System.out.println("   - 代码仓库备份");
        System.out.println("   示例：backups/database/2024-10-23.sql\n");
        
        System.out.println("🌐 【场景 3：静态资源托管】");
        System.out.println("   - 网站的 CSS、JS 文件");
        System.out.println("   - 前端打包后的静态资源");
        System.out.println("   - 可通过 CDN 加速访问");
        System.out.println("   示例：static/css/main.css\n");
        
        System.out.println("📁 【场景 4：文件管理系统】");
        System.out.println("   - 企业网盘");
        System.out.println("   - 文档管理系统");
        System.out.println("   - 支持文件分享功能");
        System.out.println("   示例：documents/2024/contract.pdf\n");
        
        System.out.println("🤖 【场景 5：大数据/机器学习】");
        System.out.println("   - 训练数据集存储");
        System.out.println("   - 模型文件保存");
        System.out.println("   - 数据湖构建");
        System.out.println("   示例：ml-data/datasets/images/\n");
        
        System.out.println("📱 【场景 6：移动应用】");
        System.out.println("   - 用户生成内容（UGC）");
        System.out.println("   - 应用资源更新");
        System.out.println("   - 离线数据同步");
        System.out.println("   示例：ugc/user123/video.mp4\n");
        
        System.out.println("===================================");
    }
}

